home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / zerozone.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  3KB  |  136 lines

  1. /***************************************************************************
  2.  
  3.   vidhrdw/zerozone.c
  4.  
  5. ***************************************************************************/
  6.  
  7. #include "driver.h"
  8. #include "vidhrdw/generic.h"
  9.  
  10. unsigned char *zerozone_videoram;
  11.  
  12. extern size_t videoram_size;
  13. static unsigned char *video_dirty;
  14.  
  15.  
  16.  
  17. READ_HANDLER( zerozone_videoram_r )
  18. {
  19.     return READ_WORD(&zerozone_videoram[offset]);
  20. }
  21.  
  22. WRITE_HANDLER( zerozone_videoram_w )
  23. {
  24.     int oldword = READ_WORD (&zerozone_videoram[offset]);
  25.     int newword = COMBINE_WORD (oldword, data);
  26.  
  27.     if (oldword != newword)
  28.     {
  29.         WRITE_WORD (&zerozone_videoram[offset],newword);
  30.         video_dirty[offset / 2] = 1;
  31.     }
  32. }
  33.  
  34.  
  35.  
  36. /* free the palette dirty array */
  37. void zerozone_vh_stop(void)
  38. {
  39.     free (video_dirty);
  40. }
  41.  
  42. /* claim a palette dirty array */
  43. int zerozone_vh_start(void)
  44. {
  45.     video_dirty = malloc (videoram_size/2);
  46.  
  47.     if (!video_dirty)
  48.     {
  49.         zerozone_vh_stop();
  50.         return 1;
  51.     }
  52.  
  53.     memset(video_dirty,1,videoram_size/2);
  54.  
  55.     return 0;
  56. }
  57.  
  58. void zerozone_update_palette (void)
  59. {
  60.     unsigned short palette_map[16]; /* range of color table is 0-15 */
  61.     int i;
  62.  
  63.     memset (palette_map, 0, sizeof (palette_map));
  64.  
  65.     /* Find colors used in the background tile plane */
  66.     for (i = 0; i < videoram_size; i += 2)
  67.     {
  68.         int tile, color;
  69.  
  70.         tile = READ_WORD (&zerozone_videoram[i]) & 0xfff;
  71.         color = (READ_WORD (&zerozone_videoram[i]) & 0xf000) >> 12;
  72.  
  73.         palette_map[color] |= Machine->gfx[0]->pen_usage[tile];
  74.     }
  75.  
  76.     /* Now tell the palette system about those colors */
  77.     for (i = 0;i < 16;i++)
  78.     {
  79.         int usage = palette_map[i];
  80.         int j;
  81.  
  82.         if (usage)
  83.         {
  84.             palette_used_colors[i * 16 + 0] = PALETTE_COLOR_TRANSPARENT;
  85.             for (j = 1; j < 16; j++)
  86.                 if (palette_map[i] & (1 << j))
  87.                     palette_used_colors[i * 16 + j] = PALETTE_COLOR_USED;
  88.                 else
  89.                     palette_used_colors[i * 16 + j] = PALETTE_COLOR_UNUSED;
  90.         }
  91.         else
  92.             memset(&palette_used_colors[i * 16],PALETTE_COLOR_UNUSED,16);
  93.     }
  94.  
  95.     if (palette_recalc ())
  96.         memset(video_dirty,1,videoram_size/2);
  97.  
  98. }
  99.  
  100. void zerozone_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  101. {
  102.     int offs;
  103.  
  104.     zerozone_update_palette ();
  105.  
  106.     if (full_refresh)
  107.         memset(video_dirty,1,videoram_size/2);
  108.  
  109.     /* Do the background first */
  110.     for (offs = 0;offs < videoram_size;offs += 2)
  111.     {
  112.         int tile, color;
  113.  
  114.         tile = READ_WORD (&zerozone_videoram[offs]) & 0xfff;
  115.         color = (READ_WORD (&zerozone_videoram[offs]) & 0xf000) >> 12;
  116.  
  117.         if (video_dirty[offs/2])
  118.         {
  119.             int sx,sy;
  120.  
  121.  
  122.             video_dirty[offs/2] = 0;
  123.  
  124.             sx = (offs/2) / 32;
  125.             sy = (offs/2) % 32;
  126.  
  127.             drawgfx(bitmap,Machine->gfx[0],
  128.                 tile,
  129.                 color,
  130.                 0,0,
  131.                 8*sx,8*sy,
  132.                 0,TRANSPARENCY_NONE,0);
  133.         }
  134.     }
  135. }
  136.